package com.mexcad.db.connectors;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.mexcad.db.delegate.DelegateConnectors;
import com.mexcad.db.dto.CKCargoPago;
import com.mexcad.db.dto.CKCredito;
import com.mexcad.db.dto.CKRenta;
import com.mexcad.db.dto.CargoPago;
import com.mexcad.db.dto.Credito;
import com.mexcad.db.dto.Renta;
import com.mexcad.db.dto.Solicitud;
import com.mexcad.db.dto.Usuario;
import com.mexcad.db.utils.ExceptionDB;
import com.mexcad.db.utils.HibernateUtil;
import com.mexcad.utils.Formatter;
import com.mexcad.utils.NumberToLetterConverter;

public class CreditoConnector {

	public static final int CREDITO_ACTIVO=1;
	public static final int CREDITO_FINALIZADO=2;
	public static final int CREDITO_CANCELADO=3;
	public static final int RENTA_ACTIVA=4;
	public static final int RENTA_PAGADA=5;
	public static final int RENTA_VENCIDA=6;
	public static final int RENTA_CREADA=7;
	public static final int RENTA_SALDO_FAVOR=8;
	public static final int CREDITO_PAGO_ANTICIPADO=9;
	
	public static final int APLICA_SUMA_CARGO_PAGO=0;
	public static final int NO_APLICA_SUMA_CARGO_PAGO=-1;
	public static final int PAGO_REVERSADO=-2;
	
	
	public static final int RENTA_CON_IVA=1;
	public static final int RENTA_ABONO=2;
	
	public static final double IVA=0.16;
	
	private static Log logger = LogFactory.getLog(CreditoConnector.class);
	
	
	
	
	public CreditoConnector(){
		logger.debug("Instanciating CreditoConnector");
	}
	
	
	public static List<Credito> getAllCreditos(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		List <Credito>lista=null;
		try{
			
			logger.debug("Querying Solicitud");
			String query =" from Credito order by apellidopaterno";
			lista=session.createQuery(query).list();
			session.close();
				
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return lista;
	}
	
	
	
	public static synchronized void eliminaCredito(int idCredito) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = session.beginTransaction();
		
		try{
			
			Credito cred= getCreditoPorId(idCredito);
	
			session.delete(cred);
			transaction.commit();
	
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session.isOpen()){
				transaction.rollback();
			}
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			if(session.isOpen()){
				transaction.rollback();
			}
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
		
	}
	
	public static synchronized void eliminaRenta(int idRenta) {
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = session.beginTransaction();
		try{	
			Renta renta= getRentaPorId(idRenta);
			renta.setIdEstatus(CreditoConnector.RENTA_CREADA);
			session.update(renta);
		//	session.delete(renta);
			transaction.commit();
	
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session.isOpen()){
				transaction.rollback();
			}
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			if(session.isOpen()){
				transaction.rollback();
			}
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
	}

	public static synchronized void actualizaEstatusPagoByCredito(int idCredito) {
		
		
		
		List <CargoPago> cargosPago= CreditoConnector.getCargoPagoByCredito(idCredito);
		for(int i=0;i<cargosPago.size();++i){
			CargoPago cp = cargosPago.get(i);
			if(cp.getSaldo() < 0){
				cp.setAbono(cp.getCapital()+cp.getIntereses()+cp.getImpuestos()+cp.getOtros());
				cp.setSaldo(0);
				cp.setIdEstatus(CreditoConnector.RENTA_PAGADA);
				CreditoConnector.actualizaCargoPago(cp);
			}
		}
	}
	
	public static List<CargoPago> getCargoPagoByCredito(int idCredito){
		Session session = HibernateUtil.getSessionFactory().openSession();
		List <CargoPago> cargosPago=null;
		try{
			logger.debug("Querying Credito");
			String query =" FROM  CargoPago where ckCargoPago.idCredito="+idCredito +" AND esPago=true";
			cargosPago=session.createQuery(query).list();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
		return cargosPago;
	}
	
	public static int  consultaStatusRentaParaBorrardo(int idRenta) {
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer status=null;
		try{	
			logger.debug("Querying Credito");
			String query =" Select idEstatus FROM  Renta where ckRenta.idRenta="+idRenta +" AND abono = 0";
			status= (Integer)session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
		
		if(status == null)
			return -1;
		else 
			return status.intValue();
		
	}
	
	public static int consultaStatusPagoParaBorrardo(int idRenta,int idCredito){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer max1=null;
		Integer max2=null;
		
		try{
			logger.debug("Querying Credito");
			
			String query = "select max(ckCargoPago.idCargoPago) from CargoPago where idRenta="+idRenta +" AND idEstatus <> -2";
			
			max1 = (Integer) session.createQuery(query).uniqueResult();
			query="select max(ckCargoPago.idCargoPago) from CargoPago where ckCargoPago.idCredito="+idCredito+" AND idEstatus <> -2";
			max2 = (Integer) session.createQuery(query).uniqueResult();
			
			session.close();
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
		if(max1 != null && max2 != null){
			if(max1.intValue() == max2.intValue()){
				return 0;
			}else {
				return -1;
			}
		}else{
			return -1;
		}
	}
	
	public static int reversarPago(int idRenta,int idCredito){
	  Session session=null;
	  
	  try{
		 session = HibernateUtil.getSessionFactory().openSession();
		logger.debug("Querying CargoPago");
		String query = "select max(ckCargoPago.idCargoPago) from CargoPago where idRenta="+idRenta;
		
		Integer max1 = (Integer) session.createQuery(query).uniqueResult();

		query =" FROM  CargoPago where ckCargoPago.idCargoPago="+max1.intValue();
		CargoPago cp=(CargoPago)session.createQuery(query).uniqueResult();
		
		Renta renta = CreditoConnector.getRentaPorId(cp.getCkCargoPago().getIdRenta());
		
		if(renta.getSaldo()<=0){
			renta.setCapital(cp.getCapital());
			renta.setIntereses(cp.getIntereses());
			renta.setImpuestos(cp.getImpuestos());
			renta.setOtros(cp.getOtros());
			renta.setSaldo(renta.getCapital()+renta.getIntereses()+renta.getImpuestos()+renta.getOtros());
			renta.setCargo(renta.getSaldo());
			renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
			
			Credito cred = CreditoConnector.getCreditoPorId(cp.getCkCargoPago().getIdCredito());
			
			cred.setMontoRestante(cred.getMontoRestante()+cp.getAbono());
			cred.setIdEstatus(CreditoConnector.CREDITO_ACTIVO);
			
			CreditoConnector.guardaRenta(renta);
			CreditoConnector.guardaCredito(cred);
			
			cp.setIdEstatus(CreditoConnector.PAGO_REVERSADO);
			CreditoConnector.actualizaCargoPago(cp);
			
			
		}else{
			renta.setCapital(renta.getCapital()+cp.getCapital());
			renta.setIntereses(renta.getIntereses()+cp.getIntereses());
			renta.setImpuestos(renta.getImpuestos()+cp.getImpuestos());
			renta.setOtros(renta.getOtros()+cp.getOtros());
			renta.setSaldo(renta.getSaldo()+cp.getAbono());	
			
			renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
			
			Credito cred = CreditoConnector.getCreditoPorId(cp.getCkCargoPago().getIdCredito());
			
			cred.setMontoRestante(cred.getMontoRestante()+renta.getSaldo()-cp.getSaldo());
			cred.setIdEstatus(CreditoConnector.CREDITO_ACTIVO);
			
			CreditoConnector.guardaRenta(renta);
			CreditoConnector.guardaCredito(cred);
			
			cp.setIdEstatus(CreditoConnector.PAGO_REVERSADO);
			CreditoConnector.actualizaCargoPago(cp);
			
			
		}
		
		

		
		
		session.close();
	  }catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null && session.isOpen())
				session.close();
			return ExceptionDB.getNumMessageDB(excepts);
	  }catch(Exception e){
			if(session!= null && session.isOpen())
				session.close();
			return ExceptionDB.getNumMessageDB(e);
	  }finally{
		  if(session!= null && session.isOpen())
				session.close();
	  }
		
		return 0;
		
	}
	

	
	
	public static int  consultaStatusRentaConSaldo(int idRenta) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer status=null;
		try{
			logger.debug("Querying Credito");
			String query =" Select idEstatus FROM  Renta where ckRenta.idRenta="+idRenta +" AND saldo <> 0";
			 status= (Integer)session.createQuery(query).uniqueResult();
			session.close();
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
		if(status == null)
			return -1;
		else 
			return status.intValue();
		
	}
	
	
	
	
	public static List<Credito> getCreditosPorCliente(int idCliente){
		Session session = HibernateUtil.getSessionFactory().openSession();
		List<Credito> lista=null;
		logger.debug("Querying Solicitud");
		try{
			String query =" FROM  Credito where ckCredito.idCliente="+idCliente;
			lista= session.createQuery(query).list();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return lista;
	}
	
	
	public static Credito consultaCreditoNumEmpleadoRFC(int idCredito, String rfc){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Credito credito=null;
		try{	
			logger.debug("Querying Credito");
			String query =" FROM  Credito where ckCredito.idCredito="+idCredito+" AND rfc='"+rfc+"'";
			credito= (Credito)session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return credito;
		
	}
	
	public static Credito getCreditoPorId(int idCredito){
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Credito credito=null;
		try{	
			logger.debug("Querying Credito");
			String query =" FROM  Credito where ckCredito.idCredito="+idCredito;
			credito= (Credito)session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			
			if(session!= null && session.isOpen())
				session.close();
		//	return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return credito;
	}
	
	public static Renta getRentaPorId(int idRenta){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Renta renta =null;
		try{
			logger.debug("Querying Credito");
			String query =" FROM  Renta where ckRenta.idRenta="+idRenta;
			renta= (Renta)session.createQuery(query).uniqueResult();
			session.close();
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return renta;
	}

	public static List<Renta> getAllRentasByCredito(int idCredito) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		List <Renta>rentas=null;
		try{
			logger.debug("Querying Credito");
			String query =" FROM  Renta where ckRenta.idCredito="+idCredito+ "order by numRenta asc";
			rentas=session.createQuery(query).list();
			session.close();
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return rentas;
	}
	
	public static List<Renta> getAllRentasSaldadasUltimaActivaByCredito(int idCredito) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		List <Renta> rentas=null;
		try{
			logger.debug("Querying Credito");
			String query =" FROM  Renta where ckRenta.idCredito="+idCredito +" AND (idEstatus="+RENTA_PAGADA+" OR idEstatus="+RENTA_ACTIVA +"OR idEstatus="+RENTA_SALDO_FAVOR+ ") order by numRenta";
			rentas=session.createQuery(query).list();
			session.close();
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		return rentas;
	}
	
	public static   int getUltimoIdCredito(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer max=null;
		try{	
			String query = "select max(ckCredito.idCredito) from Credito ";
		
			max = (Integer) session.createQuery(query).uniqueResult();
			session.close();
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}
		
		if(max==null)
			return 1;
		else
			return max+1;
		
	}
	
	public static   int getUltimoIdRenta(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer max =null;
		try{
			String query = "select max(ckRenta.idRenta) from Renta ";
		
			max = (Integer) session.createQuery(query).uniqueResult();
			session.close();
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}	
		
		
		if(max==null)
			return 1;
		else
			return max+1;
		
	}
	
	public static   int getUltimoIdCargoPago(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		String query = "select max(ckCargoPago.idCargoPago) from CargoPago ";
		Integer max =null;
		try{		
			max = (Integer) session.createQuery(query).uniqueResult();
			session.close();
		}catch(Exception e){
			
			if(session!= null && session.isOpen())
				session.close();
		} finally{
			if(session!= null && session.isOpen())
				session.close();
		}	
		
		
		if(max==null)
			return 1;
		else
			return max+1;
		
	}
	
	
	
	
	
	
	public static synchronized int guardaCreditoBySolicitud(Solicitud solicitud, int idUsuario){
		Session session=null;
		Transaction transaction =null;
		try{
 
			logger.debug("Querying Solicitud");
			session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
			Credito credito = new Credito();
			CKCredito ckCredito = new CKCredito();
			ckCredito.setIdCliente(solicitud.getCksolicitud().getIdCliente());
			ckCredito.setIdEsquemaCredito(solicitud.getIdEsquemaCredito());
			ckCredito.setIdTipoSolicitud(solicitud.getCksolicitud().getIdTipoSolicitud());
			ckCredito.setIdComisionista(solicitud.getCksolicitud().getIdComisionista());
			
			Usuario usr = UsuarioConnector.consultarUsuarioById(idUsuario);
			credito.setUsuario(usr.getNombres()+" " + usr.getApellidoPaterno()+" "+usr.getApellidoMaterno());
			credito.setNumEmpleado(solicitud.getNumEmpleado());
			credito.setRfc(solicitud.getRfc());
			credito.setCkCredito(ckCredito);
			credito.setApellidoMaterno(solicitud.getApellidoMaterno());
			credito.setApellidoPaterno(solicitud.getApellidoPaterno());
			credito.setFechaCreacion(Formatter.getFechaHoraActual());
			credito.setFechaFinal(solicitud.getFechaFinal());
			credito.setFechaIngreso(solicitud.getFechaIngreso());
			credito.setFechaInicial(solicitud.getFechaInicial());
			credito.setIdEjecutivo(solicitud.getIdEjecutivo());
			credito.setIdEstatus(CreditoConnector.CREDITO_ACTIVO);
			credito.setIdMoneda(solicitud.getIdMoneda());
			credito.setIdPeriodoSolicitado(solicitud.getIdPeriodoSolicitado());
			credito.setTasaBase(solicitud.getTasaBase());
			credito.setIdTipoContrato(solicitud.getIdTipoContrato());
			credito.setIngresosMensuales(solicitud.getIngresosMensuales());
			credito.setMontoCredito(solicitud.getMontoSolicitado());
			credito.setCalle(solicitud.getCalle().toUpperCase());
			credito.setColonia(solicitud.getColonia().toUpperCase());
			credito.setPobDelegacion(solicitud.getPobDelegacion().toUpperCase());
			credito.setCp(solicitud.getCp().toUpperCase());
			credito.setTelefono(solicitud.getTelefono().toUpperCase());
						
			String montoPeriodoStr =new NumberToLetterConverter().convertirLetras((int)solicitud.getMontoSolicitado());
			double monto = (solicitud.getMontoSolicitado()-(int)solicitud.getMontoSolicitado())*100;
			montoPeriodoStr=montoPeriodoStr+" "+DelegateConnectors.getMonedaById(solicitud.getIdMoneda()).getDescMoneda()+" "+((int)monto<10?"0"+((int)monto):((int)monto))+"/100  MN";
			
			credito.setMontoCreditoLetra(montoPeriodoStr);
			credito.setMontoPorPeriodo(solicitud.getMontoMensual());
			credito.setMontoPorPeriodoLetra(solicitud.getMensualidadLetra());
			
			//credito.setMontoTotal(solicitud.getMontoTotal());
			//credito.setMontoRestante(solicitud.getMontoTotal());
			credito.setMontoTotalLetras(solicitud.getMontoTotalLetras());
			credito.setNombreAval(solicitud.getNombreAval());
			credito.setNombres(solicitud.getNombresSolicitante());
			credito.setPlazoSolicitado(solicitud.getPlazoSolicitado());
			credito.setRequiereAval(solicitud.getRequiereAval());
			
			
			List<RentaBean> listadoRentas= SolicitudConnector.obtieneRentasPorSolicitud(solicitud);
			if(listadoRentas!= null && listadoRentas.size() > 0){
				double cuota =listadoRentas.get(0).getComision()*solicitud.getPlazoSolicitado();
				double ivaCuota=0.0;
				if(solicitud.getIdEsquemaCredito()!=SolicitudConnector.ESQUEMA_SIN_IVA){
					//ivaCuota=cuota-((double)cuota/((double)1+CreditoConnector.IVA));
					ivaCuota=cuota*CreditoConnector.IVA;
					
				}
				//cuota=cuota/((double)1+CreditoConnector.IVA);
				credito.setCuota( cuota);
				credito.setIntereses((listadoRentas.get(0).getIntereses()*solicitud.getPlazoSolicitado()));
				credito.setImpuestos(listadoRentas.get(0).getImpuestos()*solicitud.getPlazoSolicitado());
			}
			
			credito.setMontoTotal(credito.getMontoCredito()+credito.getIntereses()+credito.getCuota()+credito.getImpuestos());
			credito.setMontoRestante(credito.getMontoCredito()+credito.getIntereses()+credito.getCuota()+credito.getImpuestos());
			
			
			double cuotaPeriodo=credito.getCuota()/credito.getPlazoSolicitado();
			double interesesPeriodo=credito.getIntereses()/credito.getPlazoSolicitado();
			double impuestosPeriodo=credito.getImpuestos()/credito.getPlazoSolicitado();
			double capitalPeriodo = credito.getMontoCredito()/credito.getPlazoSolicitado();
			
			
			if(credito.getCkCredito().getIdCredito() == 0){
				credito.getCkCredito().setIdCredito(getUltimoIdCredito());
				session.save(credito);
				transaction.commit();
			}else{
			
				session.update(credito);
				transaction.commit();
			}
			
			session.close();
	
		
			
			if(credito.getCkCredito().getIdCredito() !=0){
			
				for(int i=0;i<listadoRentas.size();++i){
					RentaBean rentaBean = listadoRentas.get(i);
					Renta renta = new Renta();
					CKRenta ckRenta = new CKRenta();
					ckRenta.setIdCredito(credito.getCkCredito().getIdCredito());
					renta.setCkRenta(ckRenta);
					renta.setIdEstatus(CreditoConnector.RENTA_CREADA);
					renta.setCapital(capitalPeriodo);
					renta.setIntereses(interesesPeriodo);
					renta.setImpuestos(impuestosPeriodo);
					renta.setOtros(cuotaPeriodo);
					renta.setNumRenta(i+1);
					renta.setSaldo(rentaBean.getPrimaPago());
					renta.setCargo(rentaBean.getPrimaPago());
					renta.setAbono(0.0);
					
					renta.setIdTipoRenta(RENTA_CON_IVA);
					renta.setDescripcion("");
					//renta.setFechaRegistro(fechaRegistro)
					renta.setFechaExigible(Formatter.getDateFromString(rentaBean.getFechaExigible()));
					
					guardaRenta(renta);
				}
			}
			
			return credito.getCkCredito().getIdCredito();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			transaction.rollback();
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			transaction.rollback();
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(e);
		} 
		
	}
	
	public static synchronized int guardaRenta(Renta renta){
		Session session=null;
		Transaction transaction =null;
		try{

			session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
		
			logger.debug("Querying Renta");
			
			if(renta.getCkRenta().getIdRenta() == 0){
				renta.getCkRenta().setIdRenta(getUltimoIdRenta());
				session.save(renta);
				transaction.commit();
			}else{
			
				session.update(renta);
				transaction.commit();
			}
			
			session.close();
	
			return renta.getCkRenta().getIdRenta();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			transaction.rollback();
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(e);
		} 
		
	}
	
	public static double getMontoPorPeridoSolicitadoByCredito(Credito credito){
		if(credito != null){
			double montoMensual=0;
			double tasa = credito.getTasaBase();
			int plazo = credito.getPlazoSolicitado();
			int tipoPlazo = credito.getIdPeriodoSolicitado();
			double meses=0;
			if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
					tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
				meses=(int) Math.ceil((double)plazo/4);
			}else if(tipoPlazo == SolicitudConnector.QUINCENAL ||tipoPlazo == SolicitudConnector.QUINCENAL_10_25 || 
					tipoPlazo == SolicitudConnector.QUINCENAL_15_ULTIMO ||tipoPlazo == SolicitudConnector.QUINCENAL_3_18
					||tipoPlazo == SolicitudConnector.QUINCENAL_5_20){
				meses= (double)Math.ceil((double)plazo/2);
				
			} else if(tipoPlazo == SolicitudConnector.MENSUAL ||tipoPlazo == SolicitudConnector.MENSUAL_3 ||
					  tipoPlazo == SolicitudConnector.MENSUAL_5 ||tipoPlazo == SolicitudConnector.MENSUAL_ULTIMO){
				meses= plazo;
			} else if(tipoPlazo == SolicitudConnector.BIMESTRAL){
				meses=plazo*2;
			}
			
			double cuota=0.0;
			if(meses <=10 ){
				cuota=SolicitudConnector.cuotaAdministracionPorMes[(int)meses];
			}
			
			if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
					tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
				meses=(int) plazo/4;
			}else if(tipoPlazo == SolicitudConnector.QUINCENAL|| tipoPlazo == SolicitudConnector.QUINCENAL_10_25 || 
					tipoPlazo == SolicitudConnector.QUINCENAL_15_ULTIMO||tipoPlazo == SolicitudConnector.QUINCENAL_3_18 ||
					tipoPlazo == SolicitudConnector.QUINCENAL_5_20){
				meses= (double)plazo/2;
				
			} else if(tipoPlazo == SolicitudConnector.MENSUAL || tipoPlazo == SolicitudConnector.MENSUAL_3 || 
					tipoPlazo == SolicitudConnector.MENSUAL_5||tipoPlazo == SolicitudConnector.MENSUAL_ULTIMO){
				meses= plazo;
			} else if(tipoPlazo == SolicitudConnector.BIMESTRAL){
				meses=plazo*2;
			}
			
			
			if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
					tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
				
				tasa = (double)tasa/52;
				double interes = (double)credito.getMontoCredito()*plazo*(tasa*0.01);
				double iva = interes*CreditoConnector.IVA;
				montoMensual= credito.getMontoCredito()+interes+iva+cuota;
				return (double)(montoMensual/credito.getPlazoSolicitado());
			}else{
				
				tasa = (double)tasa/12;
				double interes = credito.getMontoCredito()*meses*(tasa*0.01);
				double iva = interes*CreditoConnector.IVA;
				montoMensual= credito.getMontoCredito()+interes+iva+cuota;
				return (double)(montoMensual/credito.getPlazoSolicitado());
			}
		}else{
			return 0.0;
			
		}
		
	}
	
	
	
	public static synchronized int guardaCreditoPorCarga(Credito credito, int idUsuario){
		Session session=null;
		Transaction transaction = null;
		
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
			
			
			Usuario usr = UsuarioConnector.consultarUsuarioById(idUsuario);
			credito.setUsuario(usr.getNombres()+" " + usr.getApellidoPaterno()+" "+usr.getApellidoMaterno());

			credito.setFechaCreacion(Formatter.getFechaHoraActual());
		//	credito.setFechaFinal(solicitud.getFechaFinal());
		//	credito.setFechaIngreso(solicitud.getFechaIngreso());
		//	credito.setFechaInicial(solicitud.getFechaInicial());

			String montoPeriodoStr =new NumberToLetterConverter().convertirLetras((int)credito.getMontoPorPeriodo());
			double monto = (credito.getMontoPorPeriodo()-(int)credito.getMontoPorPeriodo())*100;
			montoPeriodoStr=montoPeriodoStr+" "+DelegateConnectors.getMonedaById(credito.getIdMoneda()).getDescMoneda()+" "+((int)monto<10?"0"+((int)monto):((int)monto))+"/100  MN";
			credito.setMontoPorPeriodoLetra(montoPeriodoStr);			


		//	credito.setMontoRestante(solicitud.getMontoTotal());
		//	credito.setMontoTotalLetras(solicitud.getMontoTotalLetras());
						
			

			List<RentaBean> listadoRentas= obtieneRentasPorCredito(credito);
			if(listadoRentas!= null && listadoRentas.size() > 0){
							double cuota =listadoRentas.get(0).getComision()*credito.getPlazoSolicitado();
							double ivaCuota=cuota-((double)cuota/((double)1+CreditoConnector.IVA));
							cuota=cuota/((double)1+CreditoConnector.IVA);
							credito.setCuota( cuota);
							credito.setIntereses((listadoRentas.get(0).getIntereses()*credito.getPlazoSolicitado()));
							credito.setImpuestos(listadoRentas.get(0).getImpuestos()*credito.getPlazoSolicitado()+ivaCuota);
			}
			
			credito.setMontoTotal(credito.getMontoCredito()+
								  credito.getIntereses()+ 
								  credito.getCuota()+
								  credito.getImpuestos());
			credito.setMontoRestante(credito.getMontoTotal());
			
			double cuotaPeriodo=credito.getCuota()/credito.getPlazoSolicitado();
			double interesesPeriodo=credito.getIntereses()/credito.getPlazoSolicitado();
			double impuestosPeriodo=credito.getImpuestos()/credito.getPlazoSolicitado();
			double capitalPeriodo = credito.getMontoCredito()/credito.getPlazoSolicitado();
			
			logger.debug("Querying Credito");
			credito.setMontoPorPeriodo(capitalPeriodo+interesesPeriodo+impuestosPeriodo+cuotaPeriodo);
			
			session.saveOrUpdate(credito);
			transaction.commit();
			
			
			session.close();
			
			
			

						if(credito.getCkCredito().getIdCredito() !=0){
						
							for(int i=0;i<listadoRentas.size();++i){
								RentaBean rentaBean = listadoRentas.get(i);
								Renta renta = new Renta();
								CKRenta ckRenta = new CKRenta();
								renta.setCapital(capitalPeriodo);
								renta.setImpuestos(impuestosPeriodo);
								renta.setIntereses(interesesPeriodo);
								renta.setOtros(cuotaPeriodo);
								renta.setFechaRegistro(Formatter.getFechaHoraActual());
								ckRenta.setIdCredito(credito.getCkCredito().getIdCredito());
								renta.setCkRenta(ckRenta);
								renta.setIdEstatus(CreditoConnector.RENTA_CREADA);
								
									
								
								renta.setNumRenta(i+1);
								renta.setSaldo(rentaBean.getPrimaPago());
								renta.setCargo(rentaBean.getPrimaPago());
								renta.setAbono(0.0);
								
								renta.setIdTipoRenta(RENTA_CON_IVA);
								renta.setDescripcion("");
								//renta.setFechaRegistro(fechaRegistro)
								renta.setFechaExigible(Formatter.getDateFromString(rentaBean.getFechaExigible()));
								
								guardaRenta(renta);
							}
						}


			
			
			
			
		
	
			return credito.getCkCredito().getIdCredito();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			if(session!= null && session.isOpen())
				session.close();
			return ExceptionDB.getNumMessageDB(e);
		}finally{
			if(session!= null && session.isOpen())
				session.close();
			
		} 
	}
	
	
	
	
	public static List<RentaBean> obtieneRentasPorCredito(Credito cred){
		List<RentaBean> list = new ArrayList<RentaBean>();
		int cont=1;
		
		double tasaMes =0.0;
		int plazo = cred.getPlazoSolicitado();
		int tipoPlazo = cred.getIdPeriodoSolicitado();
		double meses=0;
		
		double interes =0.0;
		double iva = 0.0;
		double montoTotal= 0.0;
		double cuotaPeriodo=0.0;
		
		
		if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
				tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
			meses=(int) Math.ceil((double)plazo/4);
		}else if(tipoPlazo == SolicitudConnector.QUINCENAL || tipoPlazo == SolicitudConnector.QUINCENAL_10_25 || 
				tipoPlazo == SolicitudConnector.QUINCENAL_15_ULTIMO||tipoPlazo == SolicitudConnector.QUINCENAL_3_18||
				tipoPlazo == SolicitudConnector.QUINCENAL_5_20){
			meses= (int)Math.ceil((double)plazo/2);
		} else if(tipoPlazo == SolicitudConnector.MENSUAL|| tipoPlazo == SolicitudConnector.MENSUAL_3 || 
				tipoPlazo == SolicitudConnector.MENSUAL_5||tipoPlazo == SolicitudConnector.MENSUAL_ULTIMO){
			meses= plazo;
		} else if(tipoPlazo == SolicitudConnector.BIMESTRAL){
			meses=plazo*2;
		}
		double cuota=0.0;
		if(cred.getCkCredito().getIdEsquemaCredito() != SolicitudConnector.ESQUEMA_UNAM  && cred.getCkCredito().getIdEsquemaCredito() != SolicitudConnector.ESQUEMA_UNAM_IVA){
			if(meses <=10 ){
				cuota=SolicitudConnector.cuotaAdministracionPorMes[(int)meses];
			}
		}
		
		
		if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
				tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
			 tasaMes= (double)cred.getTasaBase()/52;
			 interes =(double) cred.getMontoCredito()*(cred.getPlazoSolicitado())*(tasaMes*0.01);
			 System.out.println(tasaMes+", "+interes+", "+cred.getPlazoSolicitado()+", "+cred.getMontoCredito());
			 
			 iva = interes*CreditoConnector.IVA;
			 montoTotal= cred.getMontoCredito()+interes+iva+cuota;
			
			
		}else{
			tasaMes= cred.getTasaBase()/12;
			if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
					tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
				meses=(int) plazo/4;
			}else if(tipoPlazo == SolicitudConnector.QUINCENAL || tipoPlazo == SolicitudConnector.QUINCENAL_10_25 || 
					tipoPlazo == SolicitudConnector.QUINCENAL_15_ULTIMO||tipoPlazo == SolicitudConnector.QUINCENAL_3_18||
					tipoPlazo == SolicitudConnector.QUINCENAL_5_20){
				//tasaMes=tasaMes/2;
				meses= (double)plazo/2;
			} else if(tipoPlazo == SolicitudConnector.MENSUAL|| tipoPlazo == SolicitudConnector.MENSUAL_3 || 
					tipoPlazo == SolicitudConnector.MENSUAL_5||tipoPlazo == SolicitudConnector.MENSUAL_ULTIMO){
				meses= plazo;
			} else if(tipoPlazo == SolicitudConnector.BIMESTRAL){
				meses=plazo*2;
			}
			
			 
			 interes = cred.getMontoCredito()*meses*(tasaMes*0.01);
			 iva = interes*CreditoConnector.IVA;
			 montoTotal= cred.getMontoCredito()+interes+iva+cuota;
		}
		
		
		
		cuotaPeriodo=(double)montoTotal/cred.getPlazoSolicitado();
		String  fechaInicialStr=cred.getFechaInicialStr();
		double amortizacion =cred.getMontoCredito()/cred.getPlazoSolicitado();
		cuota=cuota/cred.getPlazoSolicitado();
		iva=iva/cred.getPlazoSolicitado();
		interes = interes/cred.getPlazoSolicitado();
		boolean bandera=true;
		for(int i=0;i<plazo;++i){
			RentaBean renta = new RentaBean();
			renta.setAmortizacion(amortizacion);
			renta.setComision(cuota);
			renta.setImpuestos(iva);
			renta.setIntereses(interes);
			renta.setIva(iva);
			renta.setMontoBase(montoTotal);
			renta.setNumRenta(cont);
			renta.setPrimaPago(cuotaPeriodo);
			if(bandera){

				Date fechaIni =Formatter.getFechaFinalByDias(fechaInicialStr,0);
				renta.setFechaInicial(Formatter.getStringFromDate(fechaIni));
				renta.setFechaExigible(fechaInicialStr);
				
				bandera = false;
			}else{
				Date fechaIni =Formatter.getFechaFinalByDias(fechaInicialStr,1);
				renta.setFechaInicial(Formatter.getStringFromDate(fechaIni));

				if(tipoPlazo == SolicitudConnector.SEMANAL || tipoPlazo == SolicitudConnector.SEMANAL_JUEVES || 
						tipoPlazo == SolicitudConnector.SEMANAL_MARTES||tipoPlazo == SolicitudConnector.SEMANAL_VIERNES){
					fechaInicialStr=Formatter.getStringFromDate(Formatter.getFechaFinalByDias(fechaInicialStr, 7, SolicitudConnector.SEMANAL));
					renta.setFechaExigible(fechaInicialStr);
					
				}else if(tipoPlazo == SolicitudConnector.QUINCENAL || tipoPlazo == SolicitudConnector.QUINCENAL_10_25 || 
						tipoPlazo == SolicitudConnector.QUINCENAL_15_ULTIMO||tipoPlazo == SolicitudConnector.QUINCENAL_3_18 || tipoPlazo == SolicitudConnector.QUINCENAL_5_20){
					fechaInicialStr=Formatter.getStringFromDate(Formatter.getFechaFinalByDias(fechaInicialStr, 15, SolicitudConnector.QUINCENAL));
					renta.setFechaExigible(fechaInicialStr);
					
				}else if(tipoPlazo == SolicitudConnector.MENSUAL|| tipoPlazo == SolicitudConnector.MENSUAL_3 || 
						tipoPlazo == SolicitudConnector.MENSUAL_5||tipoPlazo == SolicitudConnector.MENSUAL_ULTIMO){
					fechaInicialStr=Formatter.getStringFromDate(Formatter.getFechaFinalByDias(Formatter.getStringFromDate(fechaIni), 1, SolicitudConnector.MENSUAL));
					renta.setFechaExigible(fechaInicialStr);
					
				}else if(tipoPlazo == SolicitudConnector.BIMESTRAL){
					fechaInicialStr=Formatter.getStringFromDate(Formatter.getFechaFinalByDias(fechaInicialStr, 2, SolicitudConnector.BIMESTRAL));
					renta.setFechaExigible(fechaInicialStr);
					
				}
				
			}
			
			
		//	System.out.print(cont+"\t"+getDoubleCentesimas(cuota)+"\t"+getDoubleCentesimas(iva)+"\t"+getDoubleCentesimas(interes)+"\t"+getDoubleCentesimas(montoTotal)+"\t"+fechaInicialStr+"\t");
			
		//	System.out.println("\t"+fechaInicialStr+"\t");
			
			montoTotal-=cuotaPeriodo;
			cont++;
			list.add(renta);
		}
		
		
		
		
		
		return list;
	}
	
	
	
	
	
	
	
	
	
	
	public static synchronized int actualizaCargoPago(CargoPago cp){
		Session session=null;
		Transaction transaction =null;
		try{

			session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
		
			logger.debug("Querying guardaCargoPago");
				
				session.update(cp);
				transaction.commit();
			
			session.close();
	
			return cp.getCkCargoPago().getIdCredito();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			transaction.rollback();
			if(session!= null && session.isOpen())
				session.close();
			return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			transaction.rollback();
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(e);
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
	}
	
	
	public static synchronized int guardaCredito(Credito credito){
		Session session=null;
		try{

			session = HibernateUtil.getSessionFactory().openSession();
			Transaction transaction = session.beginTransaction();
		
			logger.debug("Querying Credito");
			
			if(credito.getCkCredito().getIdCredito() == 0){
				credito.getCkCredito().setIdCredito(getUltimoIdCredito());
				session.save(credito);
				transaction.commit();
			}else{
			
				session.update(credito);
				transaction.commit();
			}
			
			session.close();
	
			return credito.getCkCredito().getIdCredito();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(excepts);
		}catch(Exception e){
			if(session!= null)
				session.close();
			return ExceptionDB.getNumMessageDB(e);
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
	}
	
	public static Renta getSiguienteRentaPorNumRentaCredito(int idCredito, int numRenta){
		Session session = null;
		Renta renta = null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			logger.debug("Querying Credito");
			String query =" FROM  Renta where ckRenta.idCredito="+idCredito+" AND numRenta="+(numRenta+1);
			renta= (Renta)session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		return renta;
	}
	
	public static   void activaRentasByDate(int idCredito, String fecha){
		logger.debug("Querying activaRentasByDate");
		
		Session session =null;
		Transaction transaction = null;
		try{
			 session = HibernateUtil.getSessionFactory().openSession();
			 transaction = session.beginTransaction();
			
			String query = "update Renta set idEstatus="+RENTA_ACTIVA+" where fechaExigible <= '"+Formatter.getDateFromString(fecha)+"' AND idEstatus <> "+CreditoConnector.RENTA_ACTIVA +" AND idEstatus <> "+CreditoConnector.RENTA_PAGADA +"AND idEstatus <> "+CreditoConnector.RENTA_SALDO_FAVOR;
		
			if(idCredito > 0){
				query+=" AND ckRenta.idCredito="+idCredito;
				
			}
			
			 session.createQuery(query).executeUpdate();
			
			transaction.commit();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
	}
	
	
	
	
	private static boolean consultaPagosParaCredito(int credito){
		logger.debug("Querying activaRentasByDate");
		Session session = null;
		Transaction transaction = null;
		List<CargoPago>pagos=null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
			String query = "from CargoPago where ckCargoPago.idCredito="+credito;
		
			pagos= session.createQuery(query).list();
			session.close();
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
		
		if(pagos !=null){
			if(pagos.size()>0)
				return false;
			else 
				return true;
		}else{
			return true;
		}
		
	}
	
	
	private static int cancelarCreditos(int credito, String fecha){
		Credito cred = CreditoConnector.getCreditoPorId(credito);
		int respuesta=0;
		if(cred !=null){
			if(cred.getIdEstatus()==CreditoConnector.CREDITO_ACTIVO && consultaPagosParaCredito(credito)){
				cred.setIdEstatus(CreditoConnector.CREDITO_CANCELADO);
				respuesta=CreditoConnector.guardaCredito(cred);
			}
		}
		return respuesta;
	}
	
	
	public static   int getUltimoIdRentaParaSaldosFavor(int idCredito){
		Session session =null;
		Integer max=null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			String query = "select max(ckRenta.idRenta) from Renta where ckRenta.idCredito="+idCredito+" AND idEstatus="+CreditoConnector.RENTA_PAGADA;
		
			
			max = (Integer) session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
		if(max==null)
			return 1;
		else
			return max+1;
		
	}
	
	public static boolean tieneRentasActivas(int idCredito){
		Session session = null;
		List<Renta> rentas =null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			
			String query = "from Renta where ckRenta.idCredito="+idCredito+" AND idEstatus="+CreditoConnector.RENTA_ACTIVA;
		
			rentas = session.createQuery(query).list();
			session.close();
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
		if(rentas != null){
			if(rentas.size() > 0){
				return true;
			}else{
				return false;
			}
				
		}else{
			return false;
		}
		
	}
	
	
	private static void ejecutaSaldos(int credito, String fecha){
		logger.debug("Querying ejecutaSaldos");
		if(fecha == null || fecha.equals("") ){
			fecha=Formatter.getStringFromDate(Formatter.getFechaHoraActual());
		}
		int indiceRentaSaldo=0;		
		if(credito > 0){

			Credito cred = getCreditoPorId(credito);
			if(cred.getIdEstatus() == CreditoConnector.CREDITO_ACTIVO){
				List<Renta> rentas = getAllRentasByCredito(cred.getCkCredito().getIdCredito());
				double saldoFavor=0;
				
				if(tieneRentasActivas(cred.getCkCredito().getIdCredito())){
				
					for(int j=0;j<rentas.size();++j){
						Renta rent = rentas.get(j);
						 if(rent.getIdEstatus() == CreditoConnector.RENTA_SALDO_FAVOR){
							 saldoFavor+=Math.abs(rent.getSaldo());
							 indiceRentaSaldo=j;
							 rent.setSaldo(0);
							 rent.setAbono(rent.getCargo());
							 rent.setIdEstatus(CreditoConnector.RENTA_PAGADA);
							 CreditoConnector.guardaRenta(rent);
						}
					}
					
					
					
					if(saldoFavor > 0){
					   actualizaEstatusPagoByCredito(cred.getCkCredito().getIdCredito());
						for(int j=0;j<rentas.size();++j){
							Renta rent = rentas.get(j);
							 if(rent.getIdEstatus() == CreditoConnector.RENTA_ACTIVA && saldoFavor >0){
								 
								 saldoFavor= CreditoConnector.ejecutaPagoRentaParaSaldos(rent.getCkRenta().getIdRenta(), saldoFavor, fecha);
								 
							}
						}
						if(saldoFavor > 0){
							Renta rent = rentas.get(indiceRentaSaldo);
							rent.setSaldo(-saldoFavor);
							 rent.setIdEstatus(CreditoConnector.RENTA_SALDO_FAVOR);
							 CreditoConnector.guardaRenta(rent);
						}
				//		ejecutaSaldos(cred.getCkCredito().getIdCredito(),  fecha);
					}
					
					
					
				}
				
			
			}
				
		}else{ // todos los creditos
			List<Credito> lista = getAllCreditos();
			for(int i=0;i<lista.size();++i){
				Credito cred = lista.get(i);
				if(cred.getIdEstatus() == CreditoConnector.CREDITO_ACTIVO){
					List<Renta> rentas = getAllRentasByCredito(cred.getCkCredito().getIdCredito());
					double saldoFavor=0;
					if(tieneRentasActivas(cred.getCkCredito().getIdCredito())){
					
						for(int j=0;j<rentas.size();++j){
							Renta rent = rentas.get(j);
							 if(rent.getIdEstatus() == CreditoConnector.RENTA_SALDO_FAVOR){
								 saldoFavor+=Math.abs(rent.getSaldo());
								 indiceRentaSaldo=j;
								 rent.setSaldo(0);
								 rent.setAbono(rent.getCargo());
								 rent.setIdEstatus(CreditoConnector.RENTA_PAGADA);
								 CreditoConnector.guardaRenta(rent);
							}
						}
						
						if(saldoFavor > 0){
							 actualizaEstatusPagoByCredito(cred.getCkCredito().getIdCredito());
								
							for(int j=0;j<rentas.size();++j){
								Renta rent = rentas.get(j);
								 if(rent.getIdEstatus() == CreditoConnector.RENTA_ACTIVA && saldoFavor >0){
									 saldoFavor= CreditoConnector.ejecutaPagoRentaParaSaldos(rent.getCkRenta().getIdRenta(), saldoFavor, fecha);
									 
								}
							}
						if(saldoFavor > 0){ 
								Renta rent = rentas.get(indiceRentaSaldo);
								rent.setSaldo(-saldoFavor);
								 rent.setIdEstatus(CreditoConnector.RENTA_SALDO_FAVOR);
								 CreditoConnector.guardaRenta(rent);
						}
						//	ejecutaSaldos(cred.getCkCredito().getIdCredito(),  fecha);
						}
						
						
					}
				}
			}
		}
	}
	
	
	
	
	private static void ejecutaInteresesMoratorios(int credito, String fecha){
	logger.debug("Querying ejecutaSaldos");
	
		
		if(credito > 0){
			Credito cred = getCreditoPorId(credito);
			if(cred.getIdEstatus() == CreditoConnector.CREDITO_ACTIVO){
				double tasaDiaria = cred.getTasaBase()/360;
				
				List<Renta> rentas = getAllRentasByCredito(credito);

				for(int j=0;j<rentas.size();++j){
					Renta rent = rentas.get(j);
					int dias = Formatter.getDiasByPeriodo(fecha,Formatter.getStringFromDate(rent.getFechaExigible()));
					 if(rent.getIdEstatus() == CreditoConnector.RENTA_ACTIVA && dias < 0 ){
						 double interesesMoratorios = rent.getCapital()*Math.abs(dias)*tasaDiaria; // calculo de intereses moratorio diario
						 CreditoConnector.ejecutaAgregarCargo(cred,rent, interesesMoratorios, fecha);
						 //saldoFavor+=Math.abs(rent.getSaldo());
					}
				}
				
			
			}
				
		}else{ // todos los creditos
			List<Credito> lista = getAllCreditos();
			for(int i=0;i<lista.size();++i){
				Credito cred = lista.get(i);
				if(cred.getIdEstatus() == CreditoConnector.CREDITO_ACTIVO){
					double tasaDiaria = cred.getTasaBase()/360;
					
					List<Renta> rentas = getAllRentasByCredito(cred.getCkCredito().getIdCredito());

					for(int j=0;j<rentas.size();++j){
						Renta rent = rentas.get(j);
						int dias = Formatter.getDiasByPeriodo(fecha,Formatter.getStringFromDate(rent.getFechaExigible()));
						 if(rent.getIdEstatus() == CreditoConnector.RENTA_ACTIVA && dias < 0 ){
							 double interesesMoratorios = rent.getCapital()*Math.abs(dias)*tasaDiaria; // calculo de intereses moratorio diario
							 CreditoConnector.ejecutaAgregarCargo(cred,rent, interesesMoratorios, fecha);
							 //saldoFavor+=Math.abs(rent.getSaldo());
						}
					}
				}			
			}
			
		}
		
	}
	// TODO Checar como dividir esos pagos
	public static int ejecutaAgregarCargo(Credito cred,Renta renta,double monto,String fecha){
		if(renta != null && cred != null){
			 Session session = null;
			 Transaction transaction = null;
		
			try{
				  session = HibernateUtil.getSessionFactory().openSession();
				  transaction = session.beginTransaction();
			
				 cred.setCargos(getDoubleCentesimas(cred.getCargos()+monto));
				 cred.setMontoRestante(cred.getMontoRestante()+monto);
				 CreditoConnector.guardaCargoPagoByRenta(renta,monto,false, fecha,false,0,0,0,0);
	
				 session.saveOrUpdate(cred);
				 transaction.commit();
				 session.close();
			}catch(org.hibernate.exception.GenericJDBCException excepts){
				if(session!= null)
					session.close();
				
			}catch(Exception e){
				if(session!= null)
					session.close();
				
			} finally{
				if(session!= null && session.isOpen())
					session.close();
				
			}				
		  	 return renta.getCkRenta().getIdCredito();
		}else{ 
			return -1;
		}
		
	}
		
	public static int ejecutaProcesosCartera(int numCredito,String fecha, boolean rentas, boolean saldos,
											 boolean interesesMoratorios, boolean cancelarCreditos){
		int respuesta=0;
		if(rentas){
			activaRentasByDate(numCredito,fecha);
		}
		if(saldos){
			ejecutaSaldos(numCredito,fecha);
		}
		if(interesesMoratorios){
			ejecutaInteresesMoratorios(numCredito,fecha);
		}
		if(cancelarCreditos){
			cancelarCreditos(numCredito, fecha);
		}
		
		
		
		return respuesta;
	}
	
	public static double getDoubleCentesimas(double num){
		int parteEntera =(int)(num*100);
		
		return (double) parteEntera/100;
	}
	
	public static double getMontoPagoAnticipadoByCredito( int idCredito){
		
		CargoPago cp = getCargoPagoAnticipadoByCredito(idCredito);
		/*
		double montoPorPagar=0.0;
		Credito cred = getCreditoPorId(idCredito);
		List<Renta> rentas = getAllRentasByCredito(idCredito);
		double montoTotal =cred.getMontoTotal();
		double montoRestante=cred.getMontoRestante();
		double intereses = cred.getIntereses()/cred.getPlazoSolicitado();
	//	double cuota = cred.getCuota()/cred.getPlazoSolicitado();
		double impuestos = cred.getImpuestos()/cred.getPlazoSolicitado();
		int cont=0;
		
		double mesesPagados = 0;
		double cuotaPagada=0.0;
		double saldoFavor=0;
		double montoCuotaPagada= 0;
		
		for(int i=0;i<rentas.size();++i){
			Renta renta =rentas.get(i);
			if(renta.getIdEstatus() == CreditoConnector.RENTA_ACTIVA ){
			
					montoPorPagar+=renta.getSaldo();//-cuota;
					if(cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL ){
						mesesPagados+=0.25;
					}else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL ){
						mesesPagados+=0.5;
					} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL){
						mesesPagados+=1;
					} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.BIMESTRAL){
						mesesPagados+=2;
					}
				
			}else if(renta.getIdEstatus() == CreditoConnector.RENTA_CREADA){
			
		
					montoPorPagar+=(renta.getSaldo()-(intereses +impuestos+renta.getOtros()));
				
				
			}else if(renta.getIdEstatus() == CreditoConnector.RENTA_SALDO_FAVOR){
				
				saldoFavor+=Math.abs(renta.getSaldo());
				
			}else if(renta.getIdEstatus() == CreditoConnector.RENTA_PAGADA  ){
			
				montoCuotaPagada+=renta.getOtros();
				if(cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL ){
					mesesPagados+=0.25;
				}else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL ){
					mesesPagados+=0.5;
				} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL){
					mesesPagados+=1;
				} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.BIMESTRAL){
					mesesPagados+=2;
				}
				
				cont++;
			}
		}
		if(cred.getCuota()!=0){
			if(mesesPagados <10){
				montoPorPagar+=((SolicitudConnector.cuotaAdministracionPagadaPorMes[(int)Math.ceil(mesesPagados)])-montoCuotaPagada)-(saldoFavor)+ cred.getCargos();
			}else{
				montoPorPagar+= cred.getCargos()-(saldoFavor);
			}
		}else{ // la cuota era cero
			if(mesesPagados <10){
				montoPorPagar+=(SolicitudConnector.cuotaAdministracionPagadaPorMes[(int)Math.ceil(mesesPagados)])-(saldoFavor)+ cred.getCargos();
			}else{
				montoPorPagar+= cred.getCargos()-(saldoFavor);
			}
		}
		return montoPorPagar;
*/
		return cp.getCapital()+cp.getIntereses()+cp.getImpuestos()+cp.getOtros();
		
	}
	
	
	public static CargoPago getCargoPagoAnticipadoByCredito( int idCredito){
		CargoPago cp= new CargoPago();
		double montoPorPagar=0.0;
		Credito cred = getCreditoPorId(idCredito);
		List<Renta> rentas = getAllRentasByCredito(idCredito);
		double montoTotal =cred.getMontoTotal();
		double montoRestante=cred.getMontoRestante();
		double intereses = cred.getIntereses()/cred.getPlazoSolicitado();
	//	double cuota = cred.getCuota()/cred.getPlazoSolicitado();
		double impuestos = cred.getImpuestos()/cred.getPlazoSolicitado();
		int cont=0;
		
		double mesesPagados = 0;
		double cuotaPagada=0.0;
		double saldoFavor=0;
		double montoCuotaPagada= 0;
		
		for(int i=0;i<rentas.size();++i){
			Renta renta =rentas.get(i);
			if(renta.getIdEstatus() == CreditoConnector.RENTA_ACTIVA ){
			
					montoPorPagar+=renta.getSaldo();//-cuota;
					if(cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL || cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL_JUEVES || 
							cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL_MARTES||cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL_VIERNES){
						mesesPagados+=0.25;
					}else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL || cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_10_25 || 
							cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_15_ULTIMO||cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_3_18||
							cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_5_20) {
						mesesPagados+=0.5;
					} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL|| cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL_ULTIMO || 
							cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL_3||cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL_5){
						mesesPagados+=1;
					} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.BIMESTRAL){
						mesesPagados+=2;
					}
					cp.setCapital(cp.getCapital()+renta.getCapital());
					cp.setImpuestos(cp.getImpuestos()+renta.getImpuestos());
					cp.setIntereses(cp.getIntereses() +renta.getIntereses());
					cp.setOtros(cp.getOtros()+renta.getOtros());
					
			}else if(renta.getIdEstatus() == CreditoConnector.RENTA_CREADA){
				//cp.setImpuestos(cp.getImpuestos()+renta.getImpuestos());			
				//cp.setIntereses(cp.getIntereses() +intereses);
				//cp.setOtros(cp.getOtros()+renta.getOtros());
				montoPorPagar+=(renta.getSaldo()-(intereses +impuestos+renta.getOtros()));
				cp.setCapital(cp.getCapital()+renta.getCapital());
				
				
			}else if(renta.getIdEstatus() == CreditoConnector.RENTA_SALDO_FAVOR){
				
				saldoFavor+=Math.abs(renta.getSaldo());
				
			}else if(renta.getIdEstatus() == CreditoConnector.RENTA_PAGADA  ){
			
				montoCuotaPagada+=renta.getOtros();
				if(cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL || cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL_JUEVES || 
						cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL_MARTES||cred.getIdPeriodoSolicitado() == SolicitudConnector.SEMANAL_VIERNES){
					mesesPagados+=0.25;
				}else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL  || cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_10_25 || 
						cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_15_ULTIMO||cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_3_18||
						cred.getIdPeriodoSolicitado() == SolicitudConnector.QUINCENAL_5_20){
					mesesPagados+=0.5;
				} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL || cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL_ULTIMO || 
						cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL_3||cred.getIdPeriodoSolicitado() == SolicitudConnector.MENSUAL_5){
					mesesPagados+=1;
				} else if(cred.getIdPeriodoSolicitado() == SolicitudConnector.BIMESTRAL){
					mesesPagados+=2;
				}
				
				cont++;
			}
		}
		double cuota=0.0;
		if(cred.getCuota()!=0){
			if(mesesPagados <10){
				cuota=((SolicitudConnector.cuotaAdministracionPagadaPorMes[(int)Math.ceil(mesesPagados)])-montoCuotaPagada)/((double)1+CreditoConnector.IVA);
				cp.setImpuestos(cp.getImpuestos()+cuota*CreditoConnector.IVA);
				montoPorPagar+=cuota-(saldoFavor)+ cred.getCargos();
				cp.setOtros(cp.getOtros()+cuota-(saldoFavor)+ cred.getCargos());
				
			}else{
				montoPorPagar+= cred.getCargos()-(saldoFavor);
				cp.setOtros(cp.getOtros()+cred.getCargos()-(saldoFavor));
				
			}
		}else{ // la cuota era cero
			if(mesesPagados <10){
				cuota=(SolicitudConnector.cuotaAdministracionPagadaPorMes[(int)Math.ceil(mesesPagados)])/((double)1+CreditoConnector.IVA);
				cp.setImpuestos(cp.getImpuestos()+cuota*CreditoConnector.IVA);
				montoPorPagar+=cuota-(saldoFavor)+ cred.getCargos();
				cp.setOtros(cuota-(saldoFavor)+ cred.getCargos());
			}else{
				montoPorPagar+= cred.getCargos()-(saldoFavor);
				cp.setOtros(cp.getOtros()+cred.getCargos()-(saldoFavor));
			}
		}
		return cp;
	}
	
	public static double ejecutaPagoRentaParaSaldos(int idRenta, double monto ,String fecha){
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = session.beginTransaction();
		double saldoRestante=0.0;
		try{
			Renta renta= getRentaPorId(idRenta);
			
			double abono = renta.getAbono();
			double saldo = renta.getSaldo();
			
			double pagoIntereses=0;
			double pagoImpuestos=0;
			double pagoCapital=0;
			double pagoOtros=0;
			

			double montoPagado=0.0;
			if(monto == saldo){
				renta.setAbono(getDoubleCentesimas(abono+monto));
				renta.setSaldo(getDoubleCentesimas(saldo - monto) );
				renta.setFechaAplicacion(Formatter.getFechaHoraActual());
				renta.setFechaRegistro(Formatter.getDateFromString(fecha));
				
				
				 pagoIntereses=renta.getIntereses();
				 pagoImpuestos=renta.getImpuestos();
				 pagoCapital=renta.getCapital();
				 pagoOtros=renta.getOtros();
				
				
				
				if(renta.getSaldo() == 0){
					renta.setIdEstatus(CreditoConnector.RENTA_PAGADA);
				}
				
			}else if(monto > saldo){ // si el monto es mayor tenemos saldo a favor
				
				saldoRestante = monto-saldo;
				montoPagado=saldo;
				renta.setAbono(getDoubleCentesimas(abono+saldo));
				renta.setSaldo(getDoubleCentesimas(0));
				
				
				pagoIntereses=renta.getIntereses();
				pagoImpuestos=renta.getImpuestos();
				pagoOtros=renta.getOtros();
				pagoCapital=renta.getCapital();
			
				
				
				renta.setCapital(0);
				renta.setIntereses(0);
				renta.setImpuestos(0);
				renta.setOtros(0);
				
				renta.setIdEstatus(CreditoConnector.RENTA_PAGADA);
				
				renta.setFechaAplicacion(Formatter.getFechaHoraActual());
				renta.setFechaRegistro(Formatter.getDateFromString(fecha));
				
				session.update(renta);
				
				//guardaCargoPagoByRenta(renta,monto,true,fecha,false);
				guardaCargoPagoByRenta(renta,montoPagado,true,fecha,false,pagoIntereses, pagoImpuestos,pagoCapital,pagoOtros  );
				
				
				
				transaction.commit();
				session.close();
				return saldoRestante;
				
				
				
			}else{ // el monto de pago es menor al saldo
				double interesesRenta =renta.getIntereses();
				double impuestosRenta = renta.getImpuestos();
				double capitalRenta = renta.getCapital();
				double cuotaRenta = renta.getOtros();
				if(monto <= interesesRenta){ //primero se paga el interes
					pagoIntereses=monto;
					renta.setIntereses(renta.getIntereses()-monto);
					renta.setSaldo(renta.getSaldo()-monto);
					renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
				}else{  // el monto alcanza para pagar totalmente los intereses
					pagoIntereses=renta.getIntereses();
					renta.setIntereses(0);
					renta.setSaldo(renta.getSaldo()-interesesRenta);
					double saldoMonto = monto-interesesRenta;
					renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
					if(saldoMonto <=impuestosRenta){ 
						pagoImpuestos= monto-interesesRenta;
						renta.setImpuestos(renta.getImpuestos()-saldoMonto);
						renta.setSaldo(renta.getSaldo()-saldoMonto);
						renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
					}else{ // el monto restante alcanza para pagar totalmente los impuestos tambi�n
						pagoImpuestos=renta.getImpuestos();
						renta.setSaldo(renta.getSaldo()-renta.getImpuestos());
						double saldoMontoMonto = saldoMonto -impuestosRenta;
						renta.setImpuestos(0);
						renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
						if(saldoMontoMonto <= cuotaRenta){
							pagoOtros=saldoMontoMonto;
							renta.setOtros(renta.getOtros()-saldoMontoMonto);
							renta.setSaldo(renta.getSaldo()-saldoMontoMonto);
							renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
						}else{// el monto restante alcanza para pagar totalmente la cuota tambi�n
							pagoOtros=renta.getOtros();
							renta.setSaldo(renta.getSaldo()-renta.getOtros());
							double saldoMontoMontoMonto = saldoMontoMonto -renta.getOtros();
							renta.setOtros(0);
							renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
							if(saldoMontoMontoMonto <= capitalRenta){
								pagoCapital=saldoMontoMontoMonto;
								renta.setCapital(renta.getCapital()-saldoMontoMontoMonto);
								renta.setSaldo(renta.getSaldo()-saldoMontoMontoMonto);
								renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
							}else{ //se puede pagar capital tambi�n
								pagoCapital=renta.getCapital();
								renta.setSaldo(renta.getSaldo()-renta.getCapital());
								double saldoMontoMontoMontoMonto = saldoMontoMontoMonto -renta.getCapital();
								renta.setCapital(0);
								renta.setSaldo(renta.getSaldo()-saldoMontoMontoMontoMonto);
								if(renta.getSaldo() <0){
									renta.setIdEstatus(CreditoConnector.RENTA_SALDO_FAVOR);
								}else{
									renta.setIdEstatus(CreditoConnector.RENTA_PAGADA);
								}
							}
							
						}
						
					}
					
				}
				
				
				
				
			}
			renta.setFechaAplicacion(Formatter.getFechaHoraActual());
			renta.setFechaRegistro(Formatter.getDateFromString(fecha));
			
			session.update(renta);
			
			//guardaCargoPagoByRenta(renta,monto,true,fecha,false);
			guardaCargoPagoByRenta(renta,monto,true,fecha,false,pagoIntereses, pagoImpuestos,pagoCapital,pagoOtros  );
			
			
			
			transaction.commit();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			transaction.rollback();
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			transaction.rollback();
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}	
		
		
		return saldoRestante;
		
	}
	
	
	
	
	
	public static int ejecutaPagoRenta(int idRenta, double monto ,String fecha){
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = session.beginTransaction();
		Renta renta= getRentaPorId(idRenta);
		try{
			
			Credito credito = getCreditoPorId(renta.getCkRenta().getIdCredito());
			
			double abono = renta.getAbono();
			double saldo = renta.getSaldo();
		
			double pagoIntereses=0;
			double pagoImpuestos=0;
			double pagoCapital=0;
			double pagoOtros=0;
			
			
			if(monto == saldo){
				double montoRestante = credito.getMontoRestante();
				credito.setMontoRestante(getDoubleCentesimas(montoRestante - monto) );
				renta.setAbono(getDoubleCentesimas(abono+monto));
				renta.setSaldo(getDoubleCentesimas(saldo - monto) );
				
				 pagoIntereses=renta.getIntereses();
				 pagoImpuestos=renta.getImpuestos();
				 pagoCapital=renta.getCapital();
				 pagoOtros=renta.getOtros();
				
				
				if(renta.getSaldo() == 0){
					renta.setIdEstatus(CreditoConnector.RENTA_PAGADA);
				}
				
			}else if(monto > saldo){ // si el monto es mayor tenemos saldo a favor
				
				double montoRestante = credito.getMontoRestante();
				credito.setMontoRestante(getDoubleCentesimas(montoRestante - monto) );
				
				renta.setAbono(getDoubleCentesimas(abono+monto));
				renta.setSaldo(getDoubleCentesimas(saldo - monto) );
				
				pagoIntereses=renta.getIntereses();
				pagoImpuestos=renta.getImpuestos();
				pagoOtros=renta.getOtros();
				pagoCapital=renta.getCapital();
				
				renta.setCapital(0);
				renta.setIntereses(0);
				renta.setImpuestos(0);
				renta.setOtros(0);
				
	
				
				
				renta.setIdEstatus(CreditoConnector.RENTA_SALDO_FAVOR);
				
				
				
			}else{ // el monto de pago es menor al saldo
				double interesesRenta =renta.getIntereses();
				double impuestosRenta = renta.getImpuestos();
				double capitalRenta = renta.getCapital();
				double cuotaRenta = renta.getOtros();
				credito.setMontoRestante(getDoubleCentesimas(credito.getMontoRestante() - monto) );
				if(monto <= interesesRenta){ //primero se paga el interes
					pagoIntereses=monto;
					renta.setIntereses(renta.getIntereses()-monto);
					renta.setSaldo(renta.getSaldo()-monto);
					renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
				}else{  // el monto alcanza para pagar totalmente los intereses
					pagoIntereses=renta.getIntereses();
					renta.setIntereses(0);
					renta.setSaldo(renta.getSaldo()-interesesRenta);
					double saldoMonto = monto-interesesRenta;
					renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
					if(saldoMonto <=impuestosRenta){ 
						
						pagoImpuestos= monto-interesesRenta;
						
						renta.setImpuestos(renta.getImpuestos()-saldoMonto);
						renta.setSaldo(renta.getSaldo()-saldoMonto);
						renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
					}else{ // el monto restante alcanza para pagar totalmente los impuestos tambi�n
						pagoImpuestos=renta.getImpuestos();
						renta.setSaldo(renta.getSaldo()-renta.getImpuestos());
						double saldoMontoMonto = saldoMonto -impuestosRenta;
						renta.setImpuestos(0);
						renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
						if(saldoMontoMonto <= cuotaRenta){
							pagoOtros=saldoMontoMonto;
	
							renta.setOtros(renta.getOtros()-saldoMontoMonto);
							renta.setSaldo(renta.getSaldo()-saldoMontoMonto);
							renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
						}else{// el monto restante alcanza para pagar totalmente la cuota tambi�n
							pagoOtros=renta.getOtros();
							
							renta.setSaldo(renta.getSaldo()-renta.getOtros());
							double saldoMontoMontoMonto = saldoMontoMonto -renta.getOtros();
							renta.setOtros(0);
							renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
							
							
							if(saldoMontoMontoMonto <= capitalRenta){
								pagoCapital=saldoMontoMontoMonto;
								renta.setCapital(renta.getCapital()-saldoMontoMontoMonto);
								renta.setSaldo(renta.getSaldo()-saldoMontoMontoMonto);
								renta.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
							}else{ //se puede pagar capital tambi�n
								pagoCapital=renta.getCapital();
								renta.setSaldo(renta.getSaldo()-renta.getCapital());
								double saldoMontoMontoMontoMonto = saldoMontoMontoMonto -renta.getCapital();
								renta.setCapital(0);
								renta.setSaldo(renta.getSaldo()-saldoMontoMontoMontoMonto);
								if(renta.getSaldo() <0){
									renta.setIdEstatus(CreditoConnector.RENTA_SALDO_FAVOR);
								}else{
									renta.setIdEstatus(CreditoConnector.RENTA_PAGADA);
								}
							}
							
						}
						
					}
					
				}
				
				
				
				
			}
			
		//	renta.setFechaAplicacion(Formatter.getFechaHoraActual());
		//	renta.setFechaRegistro(Formatter.getDateFromString(fecha));
			
			
			renta.setFechaAplicacion(Formatter.getFechaHoraActual());
			renta.setFechaRegistro(Formatter.getDateFromString(fecha));
			
			session.update(renta);
			
	
			guardaCargoPagoByRenta(renta,monto,true,fecha,false,pagoIntereses, pagoImpuestos,pagoCapital,pagoOtros  );
			
			
			if(credito.getMontoRestante() <= 0 ){
				credito.setIdEstatus(CreditoConnector.CREDITO_FINALIZADO);	
			}else{
				credito.setIdEstatus(CreditoConnector.CREDITO_ACTIVO);	
			}
			session.update(credito);
			
			
			transaction.commit();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			transaction.rollback();
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			transaction.rollback();
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}	
		return renta.getCkRenta().getIdCredito();
		
	}
	
	public static List<CargoPago> getCargoPagoByRentaCredito(int idCredito,int idRenta){
		Session session =null;
		List <CargoPago> cargosPago=null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			logger.debug("Querying Credito");
			String query =" FROM  CargoPago where ckCargoPago.idCredito="+idCredito +" AND ckCargoPago.idRenta="+idRenta;//+ " AND esPago=true";
			cargosPago=session.createQuery(query).list();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}	
		return cargosPago;
	}
	// TODO Checar como dividir esos pagos
	 
	public static int ejecutaAgregarCargo(int idRenta,double monto,double montoImpuesto,String fecha){
		Renta renta = CreditoConnector.getRentaPorId(idRenta);
		Credito credito = CreditoConnector.getCreditoPorId(renta.getCkRenta().getIdCredito());
		credito.setCargos(getDoubleCentesimas(credito.getCargos()+monto));
		credito.setImpuestos(credito.getImpuestos()+montoImpuesto);
		credito.setMontoRestante(credito.getMontoRestante() + monto+montoImpuesto);
		CreditoConnector.guardaCredito(credito);
		renta.setCargo(renta.getCargo()+monto);
		renta.setImpuestos(renta.getImpuestos()+montoImpuesto);
		renta.setSaldo(renta.getSaldo()+monto+montoImpuesto);
		guardaRenta(renta);
		CreditoConnector.guardaCargoPagoByRenta(renta,monto+montoImpuesto,false, fecha, false,0,0,0,0); 
		
		return renta.getCkRenta().getIdCredito();
	}
	
	
	private static void guardaCargoPagoByRenta(Renta renta,double monto,boolean esPago, String fecha, boolean pagoanticipado,double pagoIntereses, double pagoImpuestos,double pagoCapital,double pagoOtros ) {
		Session session=null;
		try{
			
			session = HibernateUtil.getSessionFactory().openSession();
			Transaction transaction = session.beginTransaction();
		
			logger.debug("Querying CargoPago");
			CargoPago cargoPago = new CargoPago();
			CKCargoPago ckCargoPago= new CKCargoPago();
			//ckCargoPago
			
	
			cargoPago.setIntereses(pagoIntereses);
			cargoPago.setImpuestos(pagoImpuestos);
			cargoPago.setOtros(pagoOtros);
			cargoPago.setCapital(pagoCapital);
			
			
			ckCargoPago.setIdCargoPago(getUltimoIdCargoPago());
			ckCargoPago.setIdCredito(renta.getCkRenta().getIdCredito());
			ckCargoPago.setIdRenta(renta.getCkRenta().getIdRenta());
			cargoPago.setCkCargoPago(ckCargoPago);
			cargoPago.setDescripcion("");
			
			cargoPago.setEsPago(esPago);
			
			if(esPago){
				cargoPago.setCargo(renta.getCargo());
			}else{
				cargoPago.setCargo(monto);
				
			}
				
			cargoPago.setAbono(monto);
			cargoPago.setSaldo(renta.getSaldo());
			
			if(renta.getSaldo()>0){
				cargoPago.setIdEstatus(CreditoConnector.RENTA_ACTIVA);
			}else{
				cargoPago.setIdEstatus(CreditoConnector.RENTA_PAGADA);
			}
			
			if(pagoanticipado){
				
				
				CargoPago cp1= getCargoPagoAnticipadoByCredito(renta.getCkRenta().getIdCredito());
				cargoPago.setIdEstatus(CreditoConnector.CREDITO_PAGO_ANTICIPADO);
				cargoPago.setCapital(cp1.getCapital());
				cargoPago.setImpuestos(cp1.getImpuestos());
				cargoPago.setIntereses(cp1.getIntereses());
				cargoPago.setOtros(cp1.getOtros());
				
				
			}
			
			cargoPago.setFechaAplicacion(Formatter.getFechaHoraActual());
			cargoPago.setFechaRegistro(Formatter.getDateFromString(fecha));
			
			cargoPago.setMonto(monto);
			cargoPago.setNumCargoPago(getNumCargoPago(renta.getCkRenta().getIdCredito(), renta.getCkRenta().getIdRenta()));
			
			
			session.save(cargoPago);
			transaction.commit();
			
			
			session.close();
	
		
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		} 
		
		
	}
	// TODO Checar como dividir esos pagos
	public static int ejecutaPagoAnticipado(int idCredito, double monto, String fecha){
		Credito cred = CreditoConnector.getCreditoPorId(idCredito);
		cred.setFechaFinal(Formatter.getDateFromString(fecha));
		cred.setIdEstatus(CreditoConnector.CREDITO_PAGO_ANTICIPADO);
		cred.setMontoRestante(0.0);
		
		
		
		List<Renta> rentas = CreditoConnector.getAllRentasByCredito(idCredito);
		
		Renta renta=null;
		for(int i=0;i<rentas.size();++i){
			Renta rent = rentas.get(i);
			if(rent.getIdEstatus() == CreditoConnector.RENTA_ACTIVA || rent.getIdEstatus() == CreditoConnector.RENTA_CREADA){
				renta=rent;
				break;
			}
		}
		if(renta != null){
			CreditoConnector.guardaCargoPagoByRenta(renta, monto, true,fecha,true,0,0,0,0);
		}
		return CreditoConnector.guardaCredito(cred);
	}
	
	
	
	

	private static int getNumCargoPago(int idCredito, int idRenta) {

	
		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer max = null;
		try{
			String query = "select count(*) from CargoPago where ckCargoPago.idCredito= "+idCredito+ " AND ckCargoPago.idRenta="+idRenta;
		
			max = (Integer) session.createQuery(query).uniqueResult();
			session.close();
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
		
		if(max==null)
			return 1;
		else
			return max+1;
		
	}

	
	public static List<Credito> buscarCreditos( String aPaterno, String materno,String nombre ){
			Session session =null;
			List<Credito> lista= null;
			try{
				session = HibernateUtil.getSessionFactory().openSession();
				logger.debug("Querying Credito");

				String query ="FROM  Credito WHERE apellidoPaterno  like '%"+aPaterno.toUpperCase()+ "%' AND apellidoMaterno  like '%"+materno.toUpperCase()+"%' AND nombres  like '%"+nombre.toUpperCase()+"%' ";
				
					query+=" AND idEstatus="+CREDITO_ACTIVO +" order by  ckCredito.idCredito asc";
					lista= session.createQuery(query).list();
					session.close();
					
				
			}catch(org.hibernate.exception.GenericJDBCException excepts){
				if(session!= null)
					session.close();
				
			}catch(Exception e){
				if(session!= null)
					session.close();
				
			} finally{
				if(session!= null && session.isOpen())
					session.close();
				
			}
			
		
			return lista;
		}

	

	public static List<Credito> buscarCreditos(String numCredito, String cliente,String ejecutivo, String nombre, String aPaterno, String materno, String fechaInicial, String fechaFinal){
	//public static List<Solicitud> buscarSolicitudes(String ...listadoStrings){
		String []identificadores= {" ckCredito.idCredito=",
								   " ckCredito.idCliente=",
								   " idEjecutivo=",
								   " nombres like '%",
								   " apellidoPaterno  like '%",
								   " apellidoMaterno  like '%",
								   " fechaCreacion>= '",
								   " fechaCreacion < '"};	
		
		String []listadoStrings={ numCredito,  cliente, ejecutivo, nombre.toUpperCase(),  aPaterno.toUpperCase(),  materno.toUpperCase(),  fechaInicial,  fechaFinal};
		Session session =null;
		List<Credito> lista= null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			logger.debug("Querying Credito");
			int cont=0;

			String query =" FROM  Credito ";
			//String filtro=" where ";
			
			
			if(listadoStrings[0].length() > 0){
				lista = new ArrayList<Credito>();
				Credito credito = getCreditoPorId(new Integer(listadoStrings[0]));
				if(credito!=null)
					lista.add(credito);
				
			}else{
				for(int i=0;i<listadoStrings.length;++i){
					if(listadoStrings[i].length()>0)
					  cont++;	
				}
				if(cont > 0){
					query+=" where ";
					
					for(int i=0;i<listadoStrings.length;++i){
						if(listadoStrings[i].length() > 0){
							query+=identificadores[i]+listadoStrings[i];
							if(cont==0){
								break;
							}
							if(i>2 && i<6){
								query+="%' ";
							}else if(i>=6){
								query+="' ";
									
							}
							if(cont>1){
								query+=" AND ";
							}	
							cont--;
						}
						
						  
					}
			}
				query+=" order by  ckCredito.idCredito asc";
				lista= session.createQuery(query).list();
				session.close();
				
			}
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null)
				session.close();
			
		}catch(Exception e){
			if(session!= null)
				session.close();
			
		} finally{
			if(session!= null && session.isOpen())
				session.close();
			
		}
		
	
		return lista;
	}


	
}
